package cn.design.realize.movedemo;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author dlq
 * @description
 * @date 2020/9/23 11:59
 * @since 1.0
 */
public class JdkProxy {
    /**
     * 抽象接口； 声明我(真实对象)需要代购(代理对象)帮忙做(替真实对象对象做)的事情
     * 就是我们的目标对象
     * 这里写成 Object 为了能够共用
     */
    private Object targetObject;
    public JdkProxy(Object targetObject){
        this.targetObject = targetObject;
    }

    /**
     * @description  通过 java.lang.reflect.Proxy 和  java.lang.reflect InvocationHandler  实现
     *          为目标对象（这里是 targetObject）生成代理对象
     *          Proxy.newProxyInstance 和  new InvocationHandler()
     * @return
     * @author dlq
     * @date 2020/9/23 12:04
     */
    public Object getProxyInstance(){
        return  Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(), this.targetObject.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                //只有在真正执行方法的时候才调用
                System.out.println("jdk代理----开始执行targetObject方法......");

                //执行目标对象的方法
                 Object object = method.invoke(targetObject, args);

                System.out.println("jdk代理----结束执行targetObject方法.....");
                //代理对象返回的结果
                return object;
            }
        });
    }
}
